﻿namespace LM.Servicos
{
    using System.Collections.Generic;
    using System.Linq;
    using LM.InterfacesFabricas.DTOs;
    using LM.InterfacesFabricas.Interfaces.Servicos;
    using LM.InterfacesFabricas.Utilidades;
    using LM.Negocio.Objetos;
    using LM.Negocio.Validadores;
    using LM.Repositorios;
    using LM.Repositorios.Interfaces;
    using LM.Repositorios.Conversores;

    /// <summary>
    /// Rafael.
    /// Fornece Operações para a Manipulação Do Clientes
    /// </summary>
    public class ServicoDeCliente : IServicoDeCliente
    {
        private IRepositorioDeCliente _repositorio;

        private IRepositorioDeTelefone _repositorioTelefone;

        private IRepositorioDeEndereco _repositorioEndereco;

        private ValidadorDeCliente _validador;

        private ConversorDeCliente _conversor;

        public ServicoDeCliente() 
        {
            _repositorio = FabricaDeRepositorios.Crie<IRepositorioDeCliente>();
            _repositorioTelefone = FabricaDeRepositorios.Crie<IRepositorioDeTelefone>();
            _repositorioEndereco = FabricaDeRepositorios.Crie<IRepositorioDeEndereco>();

            _validador = new ValidadorDeCliente(_repositorio, _repositorioTelefone, _repositorioEndereco);
            _conversor = new ConversorDeCliente();
        }

        #region IServicoGenerico<DtoCliente> Members

        public void Cadastre(DtoCliente dtoCliente)
        {
            var cliente = _conversor.Converta(dtoCliente);

            _validador.ValideCadastro(cliente);

            _repositorio.Cadastre(cliente);
        }

        public void Atualize(DtoCliente dtoCliente)
        {
            var cliente = _conversor.Converta(dtoCliente);

            _validador.ValideAtualizacao(cliente);

            _repositorio.Atualize(cliente);
        }

        public void Exclua(int codigo)
        {
            var cliente = ConversorDeObjetos.Copie<Cliente>(_repositorio.Consulte(codigo));

            _validador.ValideExclusao(cliente);

            _repositorio.Exclua(cliente);
        }

        public DtoCliente Consulte(int codigo)
        {
            var cliente = _repositorio.Consulte(codigo);

            return _conversor.Converta(cliente);
        }

        public IList<DtoCliente> ConsulteTodos()
        {
            var lista =  _repositorio.ConsulteTodos();
            return lista.Select(item => _conversor.Converta(item)).ToList();
        }

        #endregion
    }
}
